//using Microsoft.VisualStudio.TestTools.UnitTesting;
//
//using System.Collections.Generic;
//
//using Weazel.Gezel.Model;
//using Weazel.Gezel.Parser;
//
//using Weazel.Gezel.Model.Errors;
//
//namespace Weazel.Gezel.Parser.Test
//{
//  [TestClass]
//  public class TestParseController
//  {
//    string fsmDescription =
//                "fsm test_fsm(mydp) {                               \n" +
//                "   state s1, s2, s3, s4, s5;                       \n" +
//                "   initial s0;                                     \n" +
//                "   @s0 (ini, noout) -> s1;                         \n" +
//                "   @s1 if (mul_st_cmd) then (calc, noout) -> s2;   \n" +
//                "                       else (ini, noout) -> s1;    \n" +
//                "   @s2 (calc, noout) -> s3;                        \n" +
//                "   @s3 (calc, noout) -> s4;                        \n" +
//                "   @s4 (calc, noout) -> s5;                        \n" +
//                "   @s5 (ini, omul ) -> s1;                         \n" +
//                "}                                                  \n";
//
//
//    string fsmDescription2 =
//                "fsm mycontroller(mydatapath) {                     \n" +
//                "   initial s0;                                     \n" +
//                "   state   s1;                                     \n" +
//                "   @s0 if (a & b) then (doit1) -> s1;              \n" +
//                "       else            (doit2) -> s1;              \n" +
//                "   @s1 if (a) then                                 \n" +
//                "         if (b) then  (doit1) -> s0;               \n" +
//                "         else         (doit2) -> s0;               \n" +
//                "       else           (doit2) -> s0;               \n" +
//                "}                                                  \n";
//
//    [TestMethod]
//    public void TestParseFsm()
//    {
//      List<ParseError> errors = new List<ParseError>();
//
//      // parse standard fsm with conditions
//      Tokenizer t = new Tokenizer(fsmDescription);
//      t.PopToken(Token.Keyword);
//
//
//      Controller ctrl = ParseController.Parse(ref errors, null, t);
//      t.PopToken(Token.Eof);
//      Assert.AreEqual(errors.Count, 0);
//      Assert.AreEqual(ctrl.Name, "test_fsm");
//      Assert.AreEqual(ctrl.DatapathRef, "mydp");
//
//      // try to parse a fsm with nested conditional statements
//      t = new Tokenizer(fsmDescription2);
//      t.PopToken(Token.Keyword);
//      ctrl = ParseController.Parse(ref errors, null, t);
//      
//      t.PopToken(Token.Eof);
//      Assert.AreEqual(errors.Count, 0);
//      Assert.AreEqual(ctrl.Name, "mycontroller");
//      Assert.AreEqual(ctrl.DatapathRef, "mydatapath");
//    }
//
//    [TestMethod]
//    public void TestParseHardwired()
//    {
//      List<ParseError> errors = new List<ParseError>();
//
//      // case: 1 sfg
//      Tokenizer t = new Tokenizer("hardwired test_ctrl(mydp) { foo; }");
//      t.PopToken(Token.Keyword);
//
//      Controller ctrl = ParseController.Parse(ref errors, null, t);
//      t.PopToken(Token.Eof);
//      Assert.AreEqual(errors.Count, 0);
//      Assert.IsTrue(ctrl.Name == "test_ctrl");
//      Assert.IsTrue(ctrl.DatapathRef == "mydp");
//      Assert.IsTrue(ctrl.SignalFlowGraphRefs.Count == 1);
//      Assert.IsTrue(ctrl.SignalFlowGraphRefs[0] == "foo");
//
//      // case: no sfg's (not allowed for hardwired, but parsed anyways!)
//      t = new Tokenizer("hardwired test_ctrl(mydp) { }");
//      t.PopToken(Token.Keyword);
//
//      ctrl = ParseController.Parse(ref errors, null, t);
//      t.PopToken(Token.Eof);
//      Assert.AreEqual(errors.Count, 0);
//      Assert.IsTrue(ctrl.Name == "test_ctrl");
//      Assert.IsTrue(ctrl.DatapathRef == "mydp");
//      Assert.IsTrue(ctrl.SignalFlowGraphRefs.Count == 0);
//
//      // case: multiple sfg's (not allowed for hardwired, but parsed anyways!)
//      t = new Tokenizer("hardwired test_ctrl(a_dp) { foo; bar; }");
//      t.PopToken(Token.Keyword);
//
//      ctrl = ParseController.Parse(ref errors, null, t);
//      t.PopToken(Token.Eof);
//      Assert.AreEqual(errors.Count, 0);
//      Assert.IsTrue(ctrl.Name == "test_ctrl");
//      Assert.IsTrue(ctrl.DatapathRef == "a_dp");
//      Assert.IsTrue(ctrl.SignalFlowGraphRefs.Count == 2);
//      Assert.IsTrue(ctrl.SignalFlowGraphRefs[0] == "foo");
//      Assert.IsTrue(ctrl.SignalFlowGraphRefs[1] == "bar");
//    }
//
//    [TestMethod]
//    public void TestParseSequential()
//    {
//      List<ParseError> errors = new List<ParseError>();
//
//      // case: 1 sfg
//      Tokenizer t = new Tokenizer("sequencer test_ctrl(mydp) { foo; }");
//      t.PopToken(Token.Keyword);
//
//      Controller ctrl = ParseController.Parse(ref errors, null, t);
//      t.PopToken(Token.Eof);
//
//      Assert.AreEqual(errors.Count, 0);
//      Assert.IsTrue(ctrl.Name == "test_ctrl");
//      Assert.IsTrue(ctrl.DatapathRef == "mydp");
//      Assert.IsTrue(ctrl.SignalFlowGraphRefs.Count == 1);
//      Assert.IsTrue(ctrl.SignalFlowGraphRefs[0] == "foo");
//
//      // case: no sfg's
//      t = new Tokenizer("sequencer test_ctrl(mydp) { }");
//      t.PopToken(Token.Keyword);
//
//      ctrl = ParseController.Parse(ref errors, null, t);
//      t.PopToken(Token.Eof);
//
//      Assert.AreEqual(errors.Count, 0);
//      Assert.IsTrue(ctrl.Name == "test_ctrl");
//      Assert.IsTrue(ctrl.DatapathRef == "mydp");
//      Assert.IsTrue(ctrl.SignalFlowGraphRefs.Count == 0);
//
//      // case: multiple sfg's
//      t = new Tokenizer("sequencer test_ctrl(a_dp) { foo; bar; }");
//      t.PopToken(Token.Keyword);
//
//      ctrl = ParseController.Parse(ref errors, null, t);
//      t.PopToken(Token.Eof);
//
//      Assert.AreEqual(errors.Count, 0);
//      Assert.IsTrue(ctrl.Name == "test_ctrl");
//      Assert.IsTrue(ctrl.DatapathRef == "a_dp");
//      Assert.IsTrue(ctrl.SignalFlowGraphRefs.Count == 2);
//      Assert.IsTrue(ctrl.SignalFlowGraphRefs[0] == "foo");
//      Assert.IsTrue(ctrl.SignalFlowGraphRefs[1] == "bar");
//    }
//  }
//}